{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/malele/anaconda3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train shape: (3827, 200, 1, 6)\n",
      "Y_train shape: (3827, 16)\n",
      "X_test shape: (957, 200, 1, 6)\n",
      "Y_test shape: (957, 16)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import h5py\n",
    "import numpy as np\n",
    "import tensorflow as tf \n",
    "import keras\n",
    "from keras.layers import Input, Dense, Dropout, Activation, BatchNormalization, Flatten, Conv2D, AveragePooling2D, MaxPooling2D\n",
    "from keras.models import Model\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "def convert_to_one_hot(Y, C):\n",
    "    Y = np.eye(C)[Y.reshape(-1)].T\n",
    "    return Y\n",
    "\n",
    "file = h5py.File('DB3//DB3_S1_image.h5','r')\n",
    "imageData   = file['imageData'][:]\n",
    "imageData   = imageData*2000\n",
    "imageLabel  = file['imageLabel'][:]  \n",
    "file.close()\n",
    "\n",
    "# 随机打乱数据和标签\n",
    "N = imageData.shape[0]\n",
    "index = np.random.permutation(N)\n",
    "data  = imageData[index,:,:]\n",
    "label = imageLabel[index]\n",
    "\n",
    "# 对数据升维,标签one-hot\n",
    "data  = np.expand_dims(data, axis=2)\n",
    "label = convert_to_one_hot(label,16).T\n",
    "\n",
    "# 划分数据集\n",
    "N = data.shape[0]\n",
    "num_train = round(N*0.8)\n",
    "X_train = data[0:num_train,:,:,:]\n",
    "Y_train = label[0:num_train,:]\n",
    "X_test  = data[num_train:N,:,:,:]\n",
    "Y_test  = label[num_train:N,:]\n",
    "\n",
    "print (\"X_train shape: \" + str(X_train.shape))\n",
    "print (\"Y_train shape: \" + str(Y_train.shape))\n",
    "print (\"X_test shape: \" + str(X_test.shape))\n",
    "print (\"Y_test shape: \" + str(Y_test.shape))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "#写一个LossHistory类，保存loss和acc\n",
    "class LossHistory(keras.callbacks.Callback):\n",
    "    def on_train_begin(self, logs={}):\n",
    "        self.losses = {'batch':[], 'epoch':[]}\n",
    "        self.accuracy = {'batch':[], 'epoch':[]}\n",
    "        self.val_loss = {'batch':[], 'epoch':[]}\n",
    "        self.val_acc = {'batch':[], 'epoch':[]}\n",
    "\n",
    "    def on_batch_end(self, batch, logs={}):\n",
    "        self.losses['batch'].append(logs.get('loss'))\n",
    "        self.accuracy['batch'].append(logs.get('acc'))\n",
    "        self.val_loss['batch'].append(logs.get('val_loss'))\n",
    "        self.val_acc['batch'].append(logs.get('val_acc'))\n",
    "\n",
    "    def on_epoch_end(self, batch, logs={}):\n",
    "        self.losses['epoch'].append(logs.get('loss'))\n",
    "        self.accuracy['epoch'].append(logs.get('acc'))\n",
    "        self.val_loss['epoch'].append(logs.get('val_loss'))\n",
    "        self.val_acc['epoch'].append(logs.get('val_acc'))\n",
    "\n",
    "    def loss_plot(self, loss_type):\n",
    "        iters = range(len(self.losses[loss_type]))\n",
    "        #plt.figure()\n",
    "        plt.figure(figsize=(6,10))\n",
    "        plt.plot(iters, self.accuracy[loss_type], 'r', label='train acc')\n",
    "        plt.plot(iters, self.losses[loss_type], 'g', label='train loss')\n",
    "        if loss_type == 'epoch':\n",
    "            plt.plot(iters, self.val_acc[loss_type], 'b', label='val acc')\n",
    "            plt.plot(iters, self.val_loss[loss_type], 'k', label='val loss')\n",
    "        plt.grid(True)\n",
    "        plt.xlabel(loss_type)\n",
    "        plt.ylabel('acc-loss')\n",
    "        plt.legend(loc=\"upper right\")\n",
    "        plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 建立模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         (None, 200, 1, 6)         0         \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 200, 1, 32)        3872      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 20, 1, 32)         0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 20, 1, 64)         12352     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 10, 1, 64)         0         \n",
      "_________________________________________________________________\n",
      "conv2d_3 (Conv2D)            (None, 10, 1, 128)        24704     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_3 (MaxPooling2 (None, 5, 1, 128)         0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 640)               0         \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 640)               0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 128)               82048     \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 16)                2064      \n",
      "=================================================================\n",
      "Total params: 125,040\n",
      "Trainable params: 125,040\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "def CNN(input_shape=(200,1,6), classes=16): \n",
    "    X_input = Input(input_shape)\n",
    "    \n",
    "    X = Conv2D(filters=32, kernel_size=(20,1), strides=(1,1), activation='relu', padding='same')(X_input)\n",
    "    X = MaxPooling2D((10,1), strides=(10,1))(X)\n",
    "\n",
    "    X = Conv2D(filters=64, kernel_size=(6,1), strides=(1,1), activation='relu', padding='same')(X)\n",
    "    X = MaxPooling2D((2,1), strides=(2,1))(X)\n",
    "    \n",
    "    X = Conv2D(filters=128, kernel_size=(3,1), strides=(1,1), activation='relu',padding='same')(X)\n",
    "    X = MaxPooling2D((2,1), strides=(2,1))(X)\n",
    "    \n",
    "    X = Flatten(name='flatten')(X)\n",
    "    X = Dropout(0.5)(X)\n",
    "    X = Dense(128,activation='relu')(X)\n",
    "    X = Dropout(0.5)(X)\n",
    "    X = Dense(classes, activation='softmax')(X)\n",
    "    model = Model(inputs=X_input, outputs=X)\n",
    "    return model\n",
    "    \n",
    "model = CNN(input_shape = (200, 1, 6), classes = 16)\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练原始数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 3827 samples, validate on 957 samples\n",
      "Epoch 1/100\n",
      "3827/3827 [==============================] - 2s 528us/step - loss: 2.6888 - acc: 0.0980 - val_loss: 2.3557 - val_acc: 0.1432\n",
      "Epoch 2/100\n",
      "3827/3827 [==============================] - 1s 369us/step - loss: 2.1437 - acc: 0.2378 - val_loss: 1.7149 - val_acc: 0.3804\n",
      "Epoch 3/100\n",
      "3827/3827 [==============================] - 1s 341us/step - loss: 1.6532 - acc: 0.3802 - val_loss: 1.2600 - val_acc: 0.5507\n",
      "Epoch 4/100\n",
      "3827/3827 [==============================] - 1s 368us/step - loss: 1.2944 - acc: 0.5059 - val_loss: 1.0131 - val_acc: 0.5893\n",
      "Epoch 5/100\n",
      "3827/3827 [==============================] - 1s 353us/step - loss: 1.0833 - acc: 0.5853 - val_loss: 0.7412 - val_acc: 0.7440\n",
      "Epoch 6/100\n",
      "3827/3827 [==============================] - 1s 374us/step - loss: 0.8962 - acc: 0.6674 - val_loss: 0.6963 - val_acc: 0.7325\n",
      "Epoch 7/100\n",
      "3827/3827 [==============================] - 1s 368us/step - loss: 0.8286 - acc: 0.7024 - val_loss: 0.6223 - val_acc: 0.7638\n",
      "Epoch 8/100\n",
      "3827/3827 [==============================] - 1s 364us/step - loss: 0.7532 - acc: 0.7209 - val_loss: 0.5500 - val_acc: 0.7816\n",
      "Epoch 9/100\n",
      "3827/3827 [==============================] - 1s 383us/step - loss: 0.6831 - acc: 0.7431 - val_loss: 0.4837 - val_acc: 0.8171\n",
      "Epoch 10/100\n",
      "3827/3827 [==============================] - 1s 360us/step - loss: 0.6460 - acc: 0.7708 - val_loss: 0.4817 - val_acc: 0.8098\n",
      "Epoch 11/100\n",
      "3827/3827 [==============================] - 1s 345us/step - loss: 0.6050 - acc: 0.7771 - val_loss: 0.4707 - val_acc: 0.8318\n",
      "Epoch 12/100\n",
      "3827/3827 [==============================] - 1s 358us/step - loss: 0.5757 - acc: 0.7857 - val_loss: 0.5472 - val_acc: 0.7900\n",
      "Epoch 13/100\n",
      "3827/3827 [==============================] - 1s 370us/step - loss: 0.5481 - acc: 0.8014 - val_loss: 0.4266 - val_acc: 0.8328\n",
      "Epoch 14/100\n",
      "3827/3827 [==============================] - 1s 357us/step - loss: 0.5416 - acc: 0.7991 - val_loss: 0.4112 - val_acc: 0.8443\n",
      "Epoch 15/100\n",
      "3827/3827 [==============================] - 1s 344us/step - loss: 0.5167 - acc: 0.8111 - val_loss: 0.4033 - val_acc: 0.8454\n",
      "Epoch 16/100\n",
      "3827/3827 [==============================] - 1s 374us/step - loss: 0.4941 - acc: 0.8189 - val_loss: 0.4291 - val_acc: 0.8349\n",
      "Epoch 17/100\n",
      "3827/3827 [==============================] - 1s 366us/step - loss: 0.4546 - acc: 0.8317 - val_loss: 0.4299 - val_acc: 0.8349\n",
      "Epoch 18/100\n",
      "3827/3827 [==============================] - 1s 367us/step - loss: 0.4789 - acc: 0.8218 - val_loss: 0.4108 - val_acc: 0.8265\n",
      "Epoch 19/100\n",
      "3827/3827 [==============================] - 1s 361us/step - loss: 0.4176 - acc: 0.8469 - val_loss: 0.3833 - val_acc: 0.8589\n",
      "Epoch 20/100\n",
      "3827/3827 [==============================] - 1s 335us/step - loss: 0.4251 - acc: 0.8364 - val_loss: 0.3730 - val_acc: 0.8589\n",
      "Epoch 21/100\n",
      "3827/3827 [==============================] - 1s 353us/step - loss: 0.4012 - acc: 0.8453 - val_loss: 0.3856 - val_acc: 0.8474\n",
      "Epoch 22/100\n",
      "3827/3827 [==============================] - 1s 354us/step - loss: 0.3962 - acc: 0.8490 - val_loss: 0.3755 - val_acc: 0.8600\n",
      "Epoch 23/100\n",
      "3827/3827 [==============================] - 1s 356us/step - loss: 0.3776 - acc: 0.8524 - val_loss: 0.3621 - val_acc: 0.8412\n",
      "Epoch 24/100\n",
      "3827/3827 [==============================] - 1s 365us/step - loss: 0.3505 - acc: 0.8639 - val_loss: 0.3435 - val_acc: 0.8558\n",
      "Epoch 25/100\n",
      "3827/3827 [==============================] - 1s 364us/step - loss: 0.3545 - acc: 0.8607 - val_loss: 0.3695 - val_acc: 0.8568\n",
      "Epoch 26/100\n",
      "3827/3827 [==============================] - 1s 344us/step - loss: 0.3646 - acc: 0.8620 - val_loss: 0.3406 - val_acc: 0.8568\n",
      "Epoch 27/100\n",
      "3827/3827 [==============================] - 1s 362us/step - loss: 0.3321 - acc: 0.8761 - val_loss: 0.3411 - val_acc: 0.8537\n",
      "Epoch 28/100\n",
      "3827/3827 [==============================] - 1s 347us/step - loss: 0.3259 - acc: 0.8751 - val_loss: 0.4083 - val_acc: 0.8506\n",
      "Epoch 29/100\n",
      "3827/3827 [==============================] - 1s 350us/step - loss: 0.3109 - acc: 0.8803 - val_loss: 0.4148 - val_acc: 0.8548\n",
      "Epoch 30/100\n",
      "3827/3827 [==============================] - 1s 363us/step - loss: 0.3107 - acc: 0.8808 - val_loss: 0.3582 - val_acc: 0.8568\n",
      "Epoch 31/100\n",
      "3827/3827 [==============================] - 1s 366us/step - loss: 0.3043 - acc: 0.8845 - val_loss: 0.3245 - val_acc: 0.8694\n",
      "Epoch 32/100\n",
      "3827/3827 [==============================] - 1s 356us/step - loss: 0.2759 - acc: 0.8903 - val_loss: 0.3412 - val_acc: 0.8683\n",
      "Epoch 33/100\n",
      "3827/3827 [==============================] - 1s 371us/step - loss: 0.2786 - acc: 0.8931 - val_loss: 0.4005 - val_acc: 0.8495\n",
      "Epoch 34/100\n",
      "3827/3827 [==============================] - 1s 363us/step - loss: 0.2696 - acc: 0.8921 - val_loss: 0.3491 - val_acc: 0.8662\n",
      "Epoch 35/100\n",
      "3827/3827 [==============================] - 1s 348us/step - loss: 0.2496 - acc: 0.8986 - val_loss: 0.4016 - val_acc: 0.8495\n",
      "Epoch 36/100\n",
      "3827/3827 [==============================] - 1s 348us/step - loss: 0.2660 - acc: 0.8963 - val_loss: 0.3327 - val_acc: 0.8683\n",
      "Epoch 37/100\n",
      "3827/3827 [==============================] - 1s 364us/step - loss: 0.2466 - acc: 0.9038 - val_loss: 0.2953 - val_acc: 0.8798\n",
      "Epoch 38/100\n",
      "3827/3827 [==============================] - 1s 347us/step - loss: 0.2432 - acc: 0.9038 - val_loss: 0.3612 - val_acc: 0.8673\n",
      "Epoch 39/100\n",
      "3827/3827 [==============================] - 1s 377us/step - loss: 0.2470 - acc: 0.8994 - val_loss: 0.3563 - val_acc: 0.8673\n",
      "Epoch 40/100\n",
      "3827/3827 [==============================] - 1s 360us/step - loss: 0.2244 - acc: 0.9151 - val_loss: 0.3407 - val_acc: 0.8725\n",
      "Epoch 41/100\n",
      "3827/3827 [==============================] - 1s 381us/step - loss: 0.2425 - acc: 0.8991 - val_loss: 0.3375 - val_acc: 0.8694\n",
      "Epoch 42/100\n",
      "3827/3827 [==============================] - 1s 334us/step - loss: 0.2306 - acc: 0.9070 - val_loss: 0.3181 - val_acc: 0.8757\n",
      "Epoch 43/100\n",
      "3827/3827 [==============================] - 1s 359us/step - loss: 0.2221 - acc: 0.9161 - val_loss: 0.3186 - val_acc: 0.8788\n",
      "Epoch 44/100\n",
      "3827/3827 [==============================] - 1s 356us/step - loss: 0.2213 - acc: 0.9106 - val_loss: 0.3365 - val_acc: 0.8767\n",
      "Epoch 45/100\n",
      "3827/3827 [==============================] - 1s 377us/step - loss: 0.2069 - acc: 0.9206 - val_loss: 0.3305 - val_acc: 0.8746\n",
      "Epoch 46/100\n",
      "3827/3827 [==============================] - 1s 360us/step - loss: 0.1984 - acc: 0.9232 - val_loss: 0.3822 - val_acc: 0.8673\n",
      "Epoch 47/100\n",
      "3827/3827 [==============================] - 1s 351us/step - loss: 0.2250 - acc: 0.9085 - val_loss: 0.3278 - val_acc: 0.8694\n",
      "Epoch 48/100\n",
      "3827/3827 [==============================] - 1s 329us/step - loss: 0.1995 - acc: 0.9232 - val_loss: 0.3417 - val_acc: 0.8736\n",
      "Epoch 49/100\n",
      "3827/3827 [==============================] - 1s 363us/step - loss: 0.1951 - acc: 0.9211 - val_loss: 0.3929 - val_acc: 0.8558\n",
      "Epoch 50/100\n",
      "3827/3827 [==============================] - 1s 342us/step - loss: 0.1930 - acc: 0.9258 - val_loss: 0.3009 - val_acc: 0.8819\n",
      "Epoch 51/100\n",
      "3827/3827 [==============================] - 1s 389us/step - loss: 0.1813 - acc: 0.9242 - val_loss: 0.3247 - val_acc: 0.8861\n",
      "Epoch 52/100\n",
      "3827/3827 [==============================] - 1s 359us/step - loss: 0.1870 - acc: 0.9245 - val_loss: 0.3974 - val_acc: 0.8558\n",
      "Epoch 53/100\n",
      "3827/3827 [==============================] - 1s 368us/step - loss: 0.2052 - acc: 0.9206 - val_loss: 0.3369 - val_acc: 0.8840\n",
      "Epoch 54/100\n",
      "3827/3827 [==============================] - 1s 335us/step - loss: 0.1942 - acc: 0.9211 - val_loss: 0.3665 - val_acc: 0.8715\n",
      "Epoch 55/100\n",
      "3827/3827 [==============================] - 1s 349us/step - loss: 0.1782 - acc: 0.9292 - val_loss: 0.3595 - val_acc: 0.8798\n",
      "Epoch 56/100\n",
      "3827/3827 [==============================] - 1s 348us/step - loss: 0.1706 - acc: 0.9336 - val_loss: 0.4046 - val_acc: 0.8694\n",
      "Epoch 57/100\n",
      "3827/3827 [==============================] - 1s 353us/step - loss: 0.1770 - acc: 0.9292 - val_loss: 0.3661 - val_acc: 0.8788\n",
      "Epoch 58/100\n",
      "3827/3827 [==============================] - 1s 345us/step - loss: 0.1785 - acc: 0.9276 - val_loss: 0.4053 - val_acc: 0.8548\n",
      "Epoch 59/100\n",
      "3827/3827 [==============================] - 1s 352us/step - loss: 0.1778 - acc: 0.9274 - val_loss: 0.3839 - val_acc: 0.8704\n",
      "Epoch 60/100\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3827/3827 [==============================] - 1s 362us/step - loss: 0.1781 - acc: 0.9302 - val_loss: 0.4130 - val_acc: 0.8662\n",
      "Epoch 61/100\n",
      "3827/3827 [==============================] - 1s 373us/step - loss: 0.1673 - acc: 0.9305 - val_loss: 0.3853 - val_acc: 0.8725\n",
      "Epoch 62/100\n",
      "3827/3827 [==============================] - 1s 347us/step - loss: 0.1685 - acc: 0.9323 - val_loss: 0.3259 - val_acc: 0.8861\n",
      "Epoch 63/100\n",
      "3827/3827 [==============================] - 1s 341us/step - loss: 0.1616 - acc: 0.9344 - val_loss: 0.3666 - val_acc: 0.8819\n",
      "Epoch 64/100\n",
      "3827/3827 [==============================] - 1s 348us/step - loss: 0.1741 - acc: 0.9336 - val_loss: 0.4241 - val_acc: 0.8537\n",
      "Epoch 65/100\n",
      "3827/3827 [==============================] - 1s 365us/step - loss: 0.1521 - acc: 0.9383 - val_loss: 0.3672 - val_acc: 0.8673\n",
      "Epoch 66/100\n",
      "3827/3827 [==============================] - 1s 362us/step - loss: 0.1376 - acc: 0.9402 - val_loss: 0.3784 - val_acc: 0.8830\n",
      "Epoch 67/100\n",
      "3827/3827 [==============================] - 1s 357us/step - loss: 0.1408 - acc: 0.9407 - val_loss: 0.3692 - val_acc: 0.8746\n",
      "Epoch 68/100\n",
      "3827/3827 [==============================] - 1s 352us/step - loss: 0.1547 - acc: 0.9381 - val_loss: 0.3673 - val_acc: 0.8788\n",
      "Epoch 69/100\n",
      "3827/3827 [==============================] - 1s 369us/step - loss: 0.1964 - acc: 0.9284 - val_loss: 0.4200 - val_acc: 0.8589\n",
      "Epoch 70/100\n",
      "3827/3827 [==============================] - 1s 352us/step - loss: 0.1471 - acc: 0.9441 - val_loss: 0.3197 - val_acc: 0.8757\n",
      "Epoch 71/100\n",
      "3827/3827 [==============================] - 1s 365us/step - loss: 0.1275 - acc: 0.9451 - val_loss: 0.4089 - val_acc: 0.8662\n",
      "Epoch 72/100\n",
      "3827/3827 [==============================] - 1s 357us/step - loss: 0.1408 - acc: 0.9446 - val_loss: 0.4174 - val_acc: 0.8715\n",
      "Epoch 73/100\n",
      "3827/3827 [==============================] - 1s 362us/step - loss: 0.1477 - acc: 0.9394 - val_loss: 0.3309 - val_acc: 0.8798\n",
      "Epoch 74/100\n",
      "3827/3827 [==============================] - 1s 353us/step - loss: 0.1323 - acc: 0.9475 - val_loss: 0.3505 - val_acc: 0.8903\n",
      "Epoch 75/100\n",
      "3827/3827 [==============================] - 1s 353us/step - loss: 0.1185 - acc: 0.9493 - val_loss: 0.3847 - val_acc: 0.8788\n",
      "Epoch 76/100\n",
      "3827/3827 [==============================] - 1s 357us/step - loss: 0.1163 - acc: 0.9545 - val_loss: 0.3770 - val_acc: 0.8788\n",
      "Epoch 77/100\n",
      "3827/3827 [==============================] - 1s 356us/step - loss: 0.1186 - acc: 0.9467 - val_loss: 0.3738 - val_acc: 0.8809\n",
      "Epoch 78/100\n",
      "3827/3827 [==============================] - 1s 348us/step - loss: 0.1125 - acc: 0.9577 - val_loss: 0.4061 - val_acc: 0.8861\n",
      "Epoch 79/100\n",
      "3827/3827 [==============================] - 1s 318us/step - loss: 0.1312 - acc: 0.9483 - val_loss: 0.3944 - val_acc: 0.8871\n",
      "Epoch 80/100\n",
      "3827/3827 [==============================] - 1s 331us/step - loss: 0.1072 - acc: 0.9605 - val_loss: 0.4092 - val_acc: 0.8840\n",
      "Epoch 81/100\n",
      "3827/3827 [==============================] - 1s 336us/step - loss: 0.1072 - acc: 0.9556 - val_loss: 0.4456 - val_acc: 0.8704\n",
      "Epoch 82/100\n",
      "3827/3827 [==============================] - 1s 342us/step - loss: 0.1108 - acc: 0.9558 - val_loss: 0.4600 - val_acc: 0.8662\n",
      "Epoch 83/100\n",
      "3827/3827 [==============================] - 1s 361us/step - loss: 0.1378 - acc: 0.9475 - val_loss: 0.4165 - val_acc: 0.8683\n",
      "Epoch 84/100\n",
      "3827/3827 [==============================] - 1s 358us/step - loss: 0.1114 - acc: 0.9556 - val_loss: 0.4252 - val_acc: 0.8704\n",
      "Epoch 85/100\n",
      "3827/3827 [==============================] - 1s 379us/step - loss: 0.1124 - acc: 0.9608 - val_loss: 0.4107 - val_acc: 0.8725\n",
      "Epoch 86/100\n",
      "3827/3827 [==============================] - 1s 358us/step - loss: 0.1082 - acc: 0.9605 - val_loss: 0.4237 - val_acc: 0.8746\n",
      "Epoch 87/100\n",
      "3827/3827 [==============================] - 1s 363us/step - loss: 0.1097 - acc: 0.9598 - val_loss: 0.3771 - val_acc: 0.8892\n",
      "Epoch 88/100\n",
      "3827/3827 [==============================] - 1s 361us/step - loss: 0.1377 - acc: 0.9496 - val_loss: 0.4676 - val_acc: 0.8715\n",
      "Epoch 89/100\n",
      "3827/3827 [==============================] - 1s 349us/step - loss: 0.1438 - acc: 0.9509 - val_loss: 0.4060 - val_acc: 0.8757\n",
      "Epoch 90/100\n",
      "3827/3827 [==============================] - 1s 379us/step - loss: 0.0982 - acc: 0.9629 - val_loss: 0.4182 - val_acc: 0.8777\n",
      "Epoch 91/100\n",
      "3827/3827 [==============================] - 1s 361us/step - loss: 0.1017 - acc: 0.9621 - val_loss: 0.3817 - val_acc: 0.8892\n",
      "Epoch 92/100\n",
      "3827/3827 [==============================] - 1s 355us/step - loss: 0.1105 - acc: 0.9566 - val_loss: 0.4884 - val_acc: 0.8673\n",
      "Epoch 93/100\n",
      "3827/3827 [==============================] - 1s 365us/step - loss: 0.1067 - acc: 0.9574 - val_loss: 0.4100 - val_acc: 0.8882\n",
      "Epoch 94/100\n",
      "3827/3827 [==============================] - 1s 362us/step - loss: 0.0767 - acc: 0.9726 - val_loss: 0.4395 - val_acc: 0.8840\n",
      "Epoch 95/100\n",
      "3827/3827 [==============================] - 1s 360us/step - loss: 0.1021 - acc: 0.9603 - val_loss: 0.3801 - val_acc: 0.8861\n",
      "Epoch 96/100\n",
      "3827/3827 [==============================] - 1s 358us/step - loss: 0.1046 - acc: 0.9613 - val_loss: 0.4202 - val_acc: 0.8694\n",
      "Epoch 97/100\n",
      "3827/3827 [==============================] - 1s 348us/step - loss: 0.0846 - acc: 0.9660 - val_loss: 0.4588 - val_acc: 0.8809\n",
      "Epoch 98/100\n",
      "3827/3827 [==============================] - 1s 342us/step - loss: 0.0926 - acc: 0.9639 - val_loss: 0.4144 - val_acc: 0.8840\n",
      "Epoch 99/100\n",
      "3827/3827 [==============================] - 1s 371us/step - loss: 0.0810 - acc: 0.9718 - val_loss: 0.4409 - val_acc: 0.8819\n",
      "Epoch 100/100\n",
      "3827/3827 [==============================] - 1s 361us/step - loss: 0.0899 - acc: 0.9686 - val_loss: 0.4625 - val_acc: 0.8809\n",
      "3827/3827 [==============================] - 1s 152us/step\n",
      "Train Loss = 0.03250532105676041\n",
      "Train Accuracy = 0.9890253462241965\n",
      "957/957 [==============================] - 0s 152us/step\n",
      "Test Loss = 0.4625399319168916\n",
      "Test Accuracy = 0.8808777425107288\n",
      "time: 138.87367725372314\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "start = time.time()\n",
    "\n",
    "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
    "history = LossHistory() # 创建一个history实例\n",
    "model.fit(X_train, Y_train, epochs=100, validation_data=(X_test, Y_test),batch_size=64,callbacks=[history])\n",
    "\n",
    "preds_train = model.evaluate(X_train, Y_train)\n",
    "print(\"Train Loss = \" + str(preds_train[0]))\n",
    "print(\"Train Accuracy = \" + str(preds_train[1]))\n",
    "\n",
    "preds_test  = model.evaluate(X_test, Y_test)\n",
    "print(\"Test Loss = \" + str(preds_test[0]))\n",
    "print(\"Test Accuracy = \" + str(preds_test[1]))\n",
    "\n",
    "end = time.time()\n",
    "print(\"time:\",end-start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f9889beb198>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "history.loss_plot('epoch')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  },
  "toc": {
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
